//package com.xx.cloud.pay.controller;
//
//
//import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
//import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
//import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult;
//import com.github.binarywang.wxpay.bean.request.*;
//import com.github.binarywang.wxpay.exception.WxPayException;
//import com.xx.cloud.pay.entity.CreateOrderEntity;
//import com.xx.cloud.pay.result.IPUtils;
//import com.xx.cloud.pay.result.R;
//import com.xx.cloud.pay.service.CarPayService;
//import jakarta.servlet.http.HttpServletRequest;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.web.bind.annotation.*;
//
//
//
//
///**
// * 测试
// *
// * @ClassName WebPayController
// * @Author 小坏
// * @Date 2022/1/25、15:16
// * @Version 1.0
// */
//@RestController
//@RequestMapping("/dzz/pay")
//@Slf4j
//@CrossOrigin("*")
//public class XXWebCarController {
//
//    @Autowired
//    private CarPayService payCarService;
//
//
//
//    @GetMapping(value = "/ok")
//    public R<?> ok() {
//        return R.ok();
//    }
//
//
//    /**
//     * 统一下单(详见https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1)
//     * 在发起微信支付前，需要调用统一下单接口，获取"预支付交易会话标识"
//     * 接口地址：https://api.mch.weixin.qq.com/pay/unifiedorder
//     *
//     * @param request 请求对象，注意一些参数如appid、mchid等不用设置，方法内会自动从配置对象中获取到（前提是对应配置中已经设置）
//     */
//    @PostMapping(value = "/createOrderV3")
//    public R<?> createOrder(HttpServletRequest req, @RequestBody CreateOrderEntity request) throws WxPayException {
//        String ipAddr = IPUtils.getIpAddr(req);
//        request.setSpbillCreateIp(ipAddr);
//        return payCarService.createOrderPerson(request);
//    }
//
//    /**
//     * 统一下单
//     * V2
//     */
//    @PostMapping(value = "/createOrderV2")
//    public R<?> createOrder1(HttpServletRequest req, @RequestBody CreateOrderEntity request) {
//        String ipAddr = IPUtils.getIpAddr(req);
//        request.setSpbillCreateIp(ipAddr);
//        return payCarService.createOrderPerson1(request);
//    }
//
//
//    /**
//     * * <pre>
//     *      * 查询订单(详见https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2)
//     *      * 该接口提供所有微信支付订单的查询，商户可以通过查询订单接口主动查询订单状态，完成下一步的业务逻辑。
//     *      * 需要调用查询接口的情况：
//     *      * ◆ 当商户后台、网络、服务器等出现异常，商户系统最终未接收到支付通知；
//     *      * ◆ 调用支付接口后，返回系统错误或未知交易状态情况；
//     *      * ◆ 调用被扫支付API，返回USERPAYING的状态；
//     *      * ◆ 调用关单或撤销接口API之前，需确认支付状态；
//     *      * 接口地址：https://api.mch.weixin.qq.com/pay/orderquery
//     *      * </pre>
//     *
//     * @param transactionId 微信订单号
//     * @param outTradeNo    商户系统内部的订单号，当没提供transactionId时需要传这个。
//     */
////    @ApiOperation(value = "查询订单")
//    @GetMapping("/queryOrder")
//    public R queryOrder(@RequestParam(required = false) String transactionId, @RequestParam(required = false) String outTradeNo) throws WxPayException {
//        return payCarService.queryOrder(transactionId, outTradeNo);
//    }
//
//
//    /**
//     * V3使用
//     *
//     * @param request
//     * @return
//     */
//    @GetMapping("/queryOrderV3")
//    public R queryOrderV3(@RequestBody WxPayOrderQueryV3Request request) {
//        return payCarService.queryOrderV3(request);
//    }
//
//
//    /**
//     * <pre>
//     * 微信支付-申请退款
//     * 详见 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4
//     * 接口链接：https://api.mch.weixin.qq.com/secapi/pay/refund
//     * </pre>
//     *
//     * @param request 请求对象
//     * @return 退款操作结果
//     */
////    @ApiOperation(value = "退款")
//    @PostMapping("/refundV2")
//    public R refund(@RequestBody WxPayRefundRequest request) {
//        return payCarService.refund(request);
//    }
//
//
//    /**
//     * V3退款
//     *
//     * @param request
//     * @return
//     * @throws WxPayException
//     */
//    @PostMapping("/refundV3")
//    public R refundV3(@RequestBody WxPayRefundV3Request request) throws WxPayException {
//        return payCarService.refundV33(request);
//    }
//
//
//    /**
//     * <pre>
//     * 微信支付-查询退款
//     * 应用场景：
//     *  提交退款申请后，通过调用该接口查询退款状态。退款有一定延时，用零钱支付的退款20分钟内到账，
//     *  银行卡支付的退款3个工作日后重新查询退款状态。
//     * 详见 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_5
//     * 接口链接：https://api.mch.weixin.qq.com/pay/refundquery
//     * </pre>
//     * 以下四个参数四选一
//     *
//     * @param transactionId 微信订单号
//     * @param outTradeNo    商户订单号
//     * @param outRefundNo   商户退款单号
//     * @param refundId      微信退款单号
//     * @return 退款信息
//     */
////    @ApiOperation(value = "退款查询")
//    @GetMapping("/refundQuery")
//    public R<?> refundQuery(@RequestParam(required = false) String transactionId, @RequestParam(required = false) String outTradeNo, @RequestParam(required = false) String outRefundNo, @RequestParam(required = false) String refundId) {
//        return payCarService.refundQuery(transactionId, outTradeNo, outRefundNo, refundId);
//    }
//
//    @GetMapping("/refundQueryV3")
//    public R<?> refundQueryV3(@RequestBody WxPayRefundQueryV3Request request) {
//        return payCarService.refundQueryV3(request);
//    }
//
//    /**
//     * <pre>
//     * 关闭订单
//     * 应用场景
//     * 以下情况需要调用关单接口：
//     * 1. 商户订单支付失败需要生成新单号重新发起支付，要对原订单号调用关单，避免重复支付；
//     * 2. 系统下单后，用户支付超时，系统退出不再受理，避免用户继续，请调用关单接口。
//     * 注意：订单生成后不能马上调用关单接口，最短调用时间间隔为5分钟。
//     * 接口地址：https://api.mch.weixin.qq.com/pay/closeorder
//     * 是否需要证书：   不需要。
//     * </pre>
//     *
//     * @param outTradeNo 商户系统内部的订单号
//     */
////    @ApiOperation(value = "关闭订单")
//    @GetMapping("/closeOrder")
//    public R<?> closeOrder(@RequestParam(required = false) String transactionId, @RequestParam(required = false) String outTradeNo) {
//        return payCarService.closeOrder(transactionId, outTradeNo);
//    }
//
//
//    @GetMapping("/closeOrderV3")
//    public R<?> closeOrderV3(@RequestBody WxPayUnifiedOrderV3Request request) {
//        return payCarService.closeOrderV33(request);
//    }
//
//
//    //    @ApiOperation(value = "支付回调通知处理")
//    @PostMapping("/notify/order")
//    public String parseOrderNotifyResultPerson(@RequestBody String xmlData) throws WxPayException {
//        return payCarService.parseOrderNotifyResultPerson(xmlData);
//
//    }
//
//
//    /**
//     * TODO 异步回调V3
//     * @param notifyData
//     * @param request
//     * @return
//     * @throws WxPayException
//     */
//    @PostMapping("/notify/orderV3")
//    public String parseOrderNotifyResultPersonV3(@RequestBody String notifyData, HttpServletRequest request) throws WxPayException {
//        SignatureHeader requestHeader = getRequestHeader(request);
//        System.out.println(notifyData + "..." + requestHeader);
//        return payCarService.parseOrderNotifyResultPersonV3(notifyData, requestHeader);
//
//    }
//
//
//    /**
//     * 获取回调请求头：签名相关
//     *
//     * @param request HttpServletRequest
//     * @return SignatureHeader
//     */
//    public SignatureHeader getRequestHeader(HttpServletRequest request) {
//        // 获取通知签名
//        String signature = request.getHeader("wechatpay-signature");
//        String nonce = request.getHeader("wechatpay-nonce");
//        String serial = request.getHeader("wechatpay-serial");
//        String timestamp = request.getHeader("wechatpay-timestamp");
//
//        SignatureHeader signatureHeader = new SignatureHeader();
//        signatureHeader.setSignature(signature);
//        signatureHeader.setNonce(nonce);
//        signatureHeader.setSerial(serial);
//        signatureHeader.setTimeStamp(timestamp);
//        return signatureHeader;
//    }
//
//
//    //    @ApiOperation(value = "退款回调通知处理")
//    @PostMapping("/notify/refund")
//    public String parseRefundNotifyResult(@RequestBody String xmlData) throws WxPayException {
//        final WxPayRefundNotifyResult result = payCarService.parseRefundNotifyResult(xmlData);
//        // TODO 根据自己业务场景需要构造返回对象
//        return WxPayNotifyResponse.success("成功");
//    }
//
//
//    /**
//     * V3 退款通知
//     *
//     * @param xmlData
//     * @return
//     * @throws WxPayException
//     */
//    @PostMapping("/notify/refundV3")
//    public String parseRefundNotifyResultV3(@RequestBody String xmlData) throws WxPayException {
//        final WxPayRefundNotifyResult result = payCarService.parseRefundNotifyResultV3(xmlData);
//        // TODO 根据自己业务场景需要构造返回对象
//        return WxPayNotifyResponse.success("成功");
//    }
//
//
//    //    @ApiOperation(value = "获取支付参数")
//    @GetMapping("/getOrderNumber")
//    public R getOrderNumber(@RequestParam("orderSn") String orderSn) {
////        ApiWxParameter orderNumber = wxParameterService.getOrderNumber(orderSn);
//        return R.ok();
//    }
//
//
//    @GetMapping("/getOrderSn")
//    public R getOrderSn(@RequestParam("orderSn") String orderSn) {
////        return wxParameterService.getOrderSn(orderSn);
//        return null;
//    }
//
//
//}
